package org.feng.api.sys.constants;

import com.baomidou.mybatisplus.annotation.IEnum;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * 基础枚举接口
 *
 * @author feng
 */
public interface BaseEnum extends IEnum<Integer> {
    int getCode();

    String getDesc();

    static <T extends BaseEnum> List<T> getEnumList(Class<T> enumClass) {
        return new ArrayList<>(Arrays.asList(enumClass.getEnumConstants()));
    }

    static <T extends BaseEnum> T convertToEnum(Integer code, Class<T> cls) {
        if (code == null) {
            return null;
        }

        List<T> values = getEnumList(cls);
        return values.stream().filter(item -> item.getCode() == code).findAny().orElse(null);
    }

    static <T extends BaseEnum> T convertToEnum(String desc, Class<T> cls) {
        if (desc == null) {
            return null;
        }

        List<T> values = getEnumList(cls);
        return values.stream().filter(item -> Objects.equals(item.getDesc(), desc)).findAny().orElse(null);
    }

    @Override
    default Integer getValue() {
        return this.getCode();
    }
}
